package com.jdrx.ocp.utils;

import com.jdrx.platform.commons.rest.beans.enums.EApiStatus;
import com.jdrx.platform.commons.rest.exception.BizException;
import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.Map;

public class JwtUtil {

	/**
	 * 生成 jwt token
	 * @param signingKey 密钥
	 * @param data 数据段
	 * @param expiredSeconds 过期秒数
	 * @return jwt 验证token
	 */
	public static String generateToken(String signingKey, Map<String, Object> data, int expiredSeconds) {
		return Jwts.builder()
				.setClaims(data)
				.setExpiration(new Date(System.currentTimeMillis() + expiredSeconds * 1000L))
				.signWith(SignatureAlgorithm.HS256, signingKey)
				.compact();
	}

	/**
	 * 获取jwt body 数据段
	 * @param signingKey
	 * @param token
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static Map<String, Object> getJwtBody(String signingKey, String token) {
		if (token == null)
			return null;
		JwtParser jwtParser = Jwts.parser().setSigningKey(signingKey);
		if (jwtParser.isSigned(token)) {
			Object obj = jwtParser.parse(token).getBody();
			return obj != null ? (Map<String, Object>) obj : null;
		} else {
			return null;
		}
	}

	/**
	 * 刷新 jwt token
	 * @param signingKey 密钥
	 * @param token 数据段
	 * @param expiredSeconds 过期秒数
	 * @return jwt 验证token
	 */
	public static String refreshToken(String signingKey, String token, int expiredSeconds) throws BizException {
		Map<String, Object> jwtBody = getJwtBody(signingKey, token);
		if (jwtBody != null) {
			return generateToken(signingKey, jwtBody, expiredSeconds);
		} else {
			throw new BizException(EApiStatus.ERR_SYS.getStatus(), "刷新token失败");
		}
	}
}